﻿using System;
using UnityEngine;
using System.Collections;
/*
GameManager 脚本说明
————————————————————————————————————————————
Property 属性

	IsGameStart	游戏是否开始
	IsGameOver	游戏是否结束
	IsGamePause	游戏是否暂停
————————————————————————————————————————————
Events 事件

	StartEvents	游戏开始事件
	OverEvents	游戏结束事件
	ResetEvents	游戏重置事件
	PauseEvents	游戏暂停事件
	ContinueEvents	玩家触碰道具事件
————————————————————————————————————————————
Methods 方法

	可调用的方法（需要开发者调用）

		StartGame()	开始游戏，若游戏已经开始，则重新游戏
		Pause()		暂停游戏
		Continue()	继续游戏
		Quit()		退出游戏（退出应用）

	其它方法（会被自动调用）

		GameOver()		玩家血量为零时自动调用，此时游戏结束
		Reset()			每次开始游戏都会调用此方法重置数据
		UpdatePlayerHP()	玩家血量变化时会自动调用，更新玩家血量，但不等于更新血量条
————————————————————————————————————————————
*/
public class GameManager
{

    #region Private
    private float playerHP = 1;

    private bool isGameStart = false;
    private bool isGameOver = false;
    private bool isGamePause = false;
    #endregion

    #region Property
    /// <summary>
    /// 返回血量百分比
    /// </summary>
    /// <returns>百分比0~1</returns>
    public float PlayerHP
    {
        get { return playerHP; }
    }
    /// <summary>
    /// 游戏是否开始
    /// </summary>
    public bool IsGameStart { get { return isGameStart; } }
    /// <summary>
    /// 游戏是否结束
    /// </summary>
    public bool IsGameOver { get { return isGameOver; } }
    /// <summary>
    /// 游戏是否暂停
    /// </summary>
    public bool IsGamePause { get { return isGamePause; } }
    #endregion

    #region SingletonPattern
    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new GameManager();
            }
            return _instance;
        }
    }
    private GameManager() { }
    #endregion

    #region Events
    /// <summary>
    /// 游戏开始事件
    /// </summary>
    public event Action StartEvents = () => { };
    /// <summary>
    /// 游戏结束事件
    /// </summary>
    public event Action OverEvents = () => { };
    /// <summary>
    /// 游戏重置事件
    /// </summary>
    public event Action ResetEvents = () => { };
    /// <summary>
    /// 游戏暂停事件
    /// </summary>
    public event Action PauseEvents = () => { };
    /// <summary>
    /// 游戏继续事件
    /// </summary>
    public event Action ContinueEvents = () => { };
    /// <summary>
    /// 玩家触碰道具事件
    /// </summary>
    public event Action TriggerPropEvents = () => { };
    #endregion

    #region Methods
    /// <summary>
    /// 调用游戏重置事件
    /// </summary>
    public void Reset()
    {
        ResetEvents();
        Continue();

        isGameOver = false;
    }

    /// <summary>
    /// 调用游戏开始事件，再调用游戏重置事件
    /// </summary>
    public void StartGame()
    {
        StartEvents();
        ResetEvents();
        Continue();

        isGameStart = true;
        isGameOver = false;

        Debug.Log("Game Start");
    }

    /// <summary>
    /// 调用游戏结束事件
    /// </summary>
    public void GameOver()
    {
        OverEvents();

        isGameOver = true;
        isGameStart = false;

        Debug.Log("Game Over");
    }

    /// <summary>
    /// 游戏暂停
    /// </summary>
    public void Pause()
    {
        PauseEvents();
        Time.timeScale = 0;

        isGamePause = true;

        Debug.Log("Game Pause");
    }

    /// <summary>
    /// 游戏继续
    /// </summary>
    public void Continue()
    {
        ContinueEvents();
        Time.timeScale = 1;

        if (isGamePause)
            Debug.Log("Game Continue");

        isGamePause = false;
    }

    /// <summary>
    ///退出游戏
    /// </summary>
    public void Quit()
    {
        Application.Quit();

        Debug.Log("Game Quit");
    }

    /// <summary>
    /// 更新玩家血量
    /// </summary>
    /// <param name="value">血量百分比</param>
    public void UpdatePlayerHP(float value)
    {
        if (value > 1) value = 1;
        if (value < 0) value = 0;
        playerHP = value;
        TriggerPropEvents();
    }

    #endregion
}
